\chapter{控制器面板}
当界面顶端的工具栏切换到控制器工具栏时，左面板将显示控制器视图。控制器视图以树状显示工作站中存在的所
有机器人的虚拟控制器。

\section{概念}
虚拟控制器中包含以下概念。

\subsection{任务坐标系}
每个控制器有一个任务坐标系。任务坐标系相对于世界坐标系定义。在控制器的右键菜单中可以修改任务坐标系的位置。

控制器中定义和使用的所有坐标都相对于任务坐标系定义。例如，机器人和外部轴的基坐标系，程序中使用的工件坐标系。

\subsection{任务}
任务是控制器的执行单元，包含着控制器要执行的程序代码。一个任务在一个线程中执行。多个任务可以同时在多个线程中执行。

任务分成运动任务和非运动任务。运动任务控制机器人或者外部轴设备的运动。每个运动任务有一个机械单元组，通过机
械单元组来配置任务控制哪些设备的运动。

每个控制器都有一个默认的运动任务，用于控制所对应的机器人的运动。

\subsection{机械单元组}
每个任务对应一个机械单元组。机械单元组包含该任务所控制的机器人和外部轴设备对应的机械单元。

控制机器人运动的任务所对应的机械单元组包含机器人机械单元，以及可选的外部轴机械单元。

任务也可以只控制外部轴的运动，此时机械单元组里只包含外部轴机械单元。

\subsection{机械单元}
每个由控制器控制的机械装置都由一个机械单元表示。机械单元分成两类：机器人机械单元和外部轴机械单元。

\subsubsection{机器人机械单元}
机器人机械单元定义了对应于哪个机器人，机器人的基坐标系（相对于任务坐标系）。如果机器人安装在外部轴上，
则在机器人机械单元中需要定义基坐标系由哪个外部轴机械单元移动。

\subsubsection{外部轴机械单元}
控制器可以控制除了机器人之外的其他设备的运动，这些设备在控制器里称为外部轴。

外部轴机械单元定义了任务所控制的外部轴设备的信息，包括以下属性：

\begin{itemize}
    \item 外部轴设备：定义机械单元对应的外部轴设备
    \item 装载坐标系：定义机械单元使用的装载坐标系。有的外部轴设备拥有多个可以安装工件的坐标系，所以机
    械单元里需要指定使用哪个装载坐标系。
    \item 关节配置：配置物理关节与程序中的a,b,c,d,e,f逻辑轴的对应关系。
    \item 基坐标系：表示设备基坐标系在任务坐标系里的位姿。
\end{itemize}

\section{信号}
控制器可以创建输入和输出信号，以配合智能组件进行仿真。

左键单击信号节点，可在中央区域打开该控制器的信号表格面板。

\subsection{新建信号}
指定信号的类型和名称，创建信号。

\subsection{删除信号}
在表格行上点击右键，选择“删除”，可删除对应的信号。

\section{信号表格面板}

信号表格面板列出一个虚拟控制器的所有信号。

\section{Tenon代码}
在Tenon代码节点下列出了控制器中所有的任务及其程序模块。每个Tenon模块对应一个源代码文件。

\subsection{新建模块}
任务节点右键菜单可以新建源代码模块。

一个任务中的所有模块(.t)一起编译成任务的二进制文件(.tbin)。模块之间可以互相引用类型，变量，函数。

\subsection{删除模块}
模块节点的右键菜单可以删除该模块。

注意，当任务中所有模块都被删除后，任务的编译会失败。在有任务编译失败的情况下，不能运行仿真。

\section{代码编辑器}
左键单击模块节点，在中央区域打开代码编辑器。

编辑代码时，ctrl-s键保存代码，并自动触发任务的编译。
